【记录】将QT上绘制的PRPD图谱转为vs+DUILIB绘制中遇到的问题

您所在的位置:网站首页 prpd prps典型图谱 【记录】将QT上绘制的PRPD图谱转为vs+DUILIB绘制中遇到的问题

【记录】将QT上绘制的PRPD图谱转为vs+DUILIB绘制中遇到的问题

2024-07-12 23:24:13| 来源: 网络整理| 查看: 265

这里写自定义目录标题 QT绘制PRPD图谱转为vs+DUILIB绘制总结

QT绘制PRPD

在Qt上先将图谱绘制到位图中,然后再将位图绘制到QWidget上,这样外部窗口变换大小都不会影响到图谱的准确性。

m_Bitmap->fill(Qt::transparent);//用透明色填充 QPainter m_MemDC(m_Bitmap); QPainter* m_MemDCBK=pDC; QRect rectBK = rect; m_MemDCBK->fillRect(rectBK,QColor(0,0,0)); m_MemDCBK->setPen(QColor(255,255,255)); QRect rectFP = QRect(0,0,FP_X,FP_Y); m_MemDC.fillRect(rectFP,m_colorBK); QPen GrayPen(m_colorBKLine,0,Qt::SolidLine); m_MemDC.setPen(GrayPen); m_MemDC.drawLine(rectFP.left(),rectFP.top()+rectFP.height()/2,rectFP.right(),rectFP.top()+rectFP.height()/2); int nOldY = rectFP.top()+rectFP.height()/2; int nY = rectFP.top()+rectFP.height()/2; for(int k=rectFP.left();k nTypeValue = FP_Y/2; } else if(g_nFPType == 1) { nTypeValue = FP_Y; } for(int i=0;i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for(int j=0;j if(m_colorBK!=GetFPColor(m_sStateMap[i][j])) { m_MemDC.setPen(GetFPColor(m_sStateMap[i][j])); m_MemDC.drawPoint(QPointF(i,j)); } } } } m_MemDCBK->setFont(QFont("Times",8,QFont::Black)); m_MemDCBK->drawPixmap(30,0,rect.width()-30,rect.height()-20,*m_Bitmap,0,0,FP_X,FP_Y); m_MemDC.end(); m_MemDCBK->end(); 图谱转为vs+DUILIB绘制

刚将代码放到duilib框架中时,想的是直接绘制出来

void xxx::PaintBkImage(HDC hDC) { int32_t left = m_rcItem.left; int32_t right = m_rcItem.right - 1; int32_t top = m_rcItem.top; int32_t bottom = m_rcItem.bottom - 1; int32_t width = right - left; int32_t height = bottom - top; RECT rc_line = { 0 }; rc_line.left = 0; rc_line.top = height / 2; rc_line.right = width; rc_line.bottom = height / 2; CRenderEngine::DrawLine(memdc, rc_line, 2, m_colorBKLine); int nOldY = height / 2; int nY = height / 2; for (int k = 0; k int nTypeValue; if (g_nFPType == 0) { nTypeValue = FP_Y / 2; } else if (g_nFPType == 1) { nTypeValue = FP_Y; } for (int i = 0; i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for (int j = 0; j if (m_colorBK != GetFPColor(m_sStateMap[i][j])) { HPEN pen = CreatePen(PS_SOLID, 2, GetFPColor(m_sStateMap[i][j])); HGDIOBJ old_pen = SelectObject(hDC, pen); Ellipse(hDC, i, j, i + 1, j + 1); SelectObject(hDC, old_pen); DeletePen(pen); } } } } }

这样就遇到了一个很严重的问题,背景正弦曲线虽然会跟着窗口大小变动而变动,但图谱的数据却重新分布重新绘制了。所以还是得使用位图来绘制。

void xxx::PaintBkImage(HDC hDC) { HDC memdc = CreateCompatibleDC(hDC); HBITMAP hbmp = CreateCompatibleBitmap(hDC, FP_X, FP_Y); HBITMAP holdbmp = (HBITMAP)SelectObject(memdc, hbmp); rc_line.left = 0; rc_line.top = FP_Y / 2; rc_line.right = FP_X; rc_line.bottom = FP_Y / 2; CRenderEngine::DrawLine(memdc, rc_line, 2, m_colorBKLine); int nOldY = FP_Y / 2; int nY = FP_Y / 2; for (int k = 0; k int nTypeValue; if (g_nFPType == 0) { nTypeValue = FP_Y / 2; } else if (g_nFPType == 1) { nTypeValue = FP_Y; } for (int i = 0; i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for (int j = 0; j if (m_colorBK != GetFPColor(m_sStateMap[i][j])) { HPEN pen = CreatePen(PS_SOLID, 2, GetFPColor(m_sStateMap[i][j])); HGDIOBJ old_pen = SelectObject(memdc, pen); Ellipse(memdc, i, j, i + 1, j + 1); SelectObject(memdc, old_pen); DeletePen(pen); } } } } } 总结

Qt画点使用drawPoint,用dui画点要用Ellipse,且right - left = bottom - top。 创建新的HBITMAP要使用CreateCompatibleBitmap而不能用CreateBitmap,原因是CreateBitmap似乎只支持8x8的位图。 画笔、画刷、画布、位图的句柄用完之后一定要释放。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭